﻿/*+===================================================================
File:      BossThreeChild.cpp

Summary:   Định nghĩa các phương thức của CBossThreeChild.
===================================================================+*/

#include "BossThreeChild.h"
#include "Explosion.h"
#include "PlayState.h"

#define VX 250.0f
#define VY -250.0f

CBossThreeChild::CBossThreeChild(D3DXVECTOR2 pos, int id, int typeID, int directionX) : CMoveableObject(pos, id, typeID)
{
	m_pSprite = new CSprite(*m_pResourceManager->GetSprite(ID_SPRITE_BOSS_THREE_CHILD));

	m_directionX = directionX;
	m_v.x = VX * m_directionX;
	m_canReverseVecX = true;

	m_box.width = 53.0f;
	m_box.height = 36.0f;
}

CBossThreeChild::~CBossThreeChild()
{

}

void CBossThreeChild::Update(float timeFrame)
{
	if (!m_bIsLive)
		return;

	D3DXVECTOR2 tranformPos = CViewport::GetInstance()->TransformMatrix(m_pos);
	if (m_canReverseVecX) 
	{
		// Chưa chạm giới hạn X của camera lần nào, nếu chạm thì vecX = 0, có vẫn tốc Y kéo xuống.
		if (tranformPos.x - m_pSprite->GetWidth() / 2.0f <= 0 || tranformPos.x + m_pSprite->GetWidth() / 2.0f > SCREEN_WIDTH)
		{
			m_v.x = 0.0f;
			m_v.y = VY;
		}
	}
	else 
	{
		// Đã chạm giới hạn X của camera 1 lần, nếu chạm đổi thì biến mất.
		if (tranformPos.x - m_pSprite->GetWidth() / 2.0f < 0 || tranformPos.x + m_pSprite->GetWidth() / 2.0f > SCREEN_WIDTH)
		{
			m_bIsLive = false;
			// Reset lại ban đầu.
			m_canReverseVecX = true;
		}
	}

	m_pSprite->Update(timeFrame);
	UpdateBox(timeFrame);
}

void CBossThreeChild::UpdateCollision(vector<CGameObject*> vecGameObjs, float timeFrame)
{
	if (!m_bIsLive)
		return;

	float timeCollision = timeFrame;
	float normalx = 0.0f, normaly = 0.0f;
	CGameObject* objCollision = NULL;

	// Xử lí va chạm với đạn của Bill
	for (int i = 0; i < CPlayState::s_billBullets.size(); i++)
	{
		if (CPlayState::s_billBullets[i]->IsLive())
		{
			float t = CheckCollision(CPlayState::s_billBullets[i], normalx, normaly, timeFrame);

			if (t < timeFrame && t < timeCollision)
			{
				// Tìm đối tượng và thời gian va chạm sớm nhất.
				timeCollision = t;
				objCollision = CPlayState::s_billBullets[i];
			}
		}
	}

	// Xử lí va chạm
	if (objCollision != NULL)
	{
		this->Kill();
		this->m_canReverseVecX = true;
		m_v.x = VX * m_directionX;
		m_v.y = 0.0f;
		objCollision->Kill();
	}


	timeCollision = timeFrame;
	normalx = 0.0f, normaly = 0.0f;
	objCollision = NULL; // Đối tượng va chạm sớm nhất.

	//Va chạm với đất
	for (int i = 0; i < vecGameObjs.size(); i++)
	{
		float t = CheckCollision(vecGameObjs[i], normalx, normaly, timeFrame);
		if (t < timeFrame)
		{
			switch (vecGameObjs[i]->GetTypeId())
			{
			case ID_GRASS_CAN_FALL:
			case ID_GRASS:
				if (normaly == 1.0f)
				{
					objCollision = vecGameObjs[i];
					timeCollision = t;
				}
				break;
			}
		}
	}

	// Xử lí va chạm
	if (objCollision != NULL)
	{
		m_v.y += m_a.y * timeCollision;
		m_pos.y += m_v.y * timeCollision;
		m_pos.y += 0.1f;
		m_v.y = 0.0f;

		if (m_canReverseVecX)
		{
			m_directionX *= -1;
			m_v.x = VX * m_directionX;
			m_canReverseVecX = false;
		}
	}

	m_pos += m_v * timeFrame;
	m_v += m_a* timeFrame;
}

bool CBossThreeChild::Kill()
{
	m_bIsLive = false;

	CExplosion* ex = new CExplosion(m_pos, 0, ID_ENEMY_EXPLOSION);
	CPlayState::s_objsOutSideQuadTree.push_back(ex);

	return true;
}

void CBossThreeChild::SetPos(D3DXVECTOR2 pos)
{
	m_pos = pos;
}

void CBossThreeChild::SetIsLive(bool isLive)
{
	m_bIsLive = isLive;
}

int CBossThreeChild::GetDirectionX()
{
	return m_directionX;
}